const utilsModule = ((Function) => {
    /***
     * 1. test.call() 让test()执行
     * 2. test 的this指向 call的第一个参数
     * 3. call的第二个参数开始是test的参数列表
     */

    /**
     *  test.myCall(obj,'a','b')
     * ctx-->obj
     * this-->test
     * @param {*} ctx 
     */
    Function.prototype.myCall = function (ctx) {
        // ctx始终是一个对象
        ctx = ctx ? Object(ctx) : window;
        // originFn是一个源函数 originFn与test指向的是同一个内存地址
        ctx.originFn = this;
        // 拿到myCall的第二个参数开始到结束的参数作为test的实参列表
        // i=1从第二个参数开始
        var args = [];
        for (var i = 1; i < arguments.length; i++) {
            args.push('arguments[' + i + ']');
        }
        // eval执行字符串程序
        const ret = eval('ctx.originFn(' + args + ')');
        delete ctx.originFn;
        return ret;
    };
    Function.prototype.myApply = function(){
        
    }
})(Function);

export default utilsModule;